home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
AMICUS
/
AMIBEST1.ADF
/
AmigaBasicStuff
/
RatMaze
< prev
next >
Wrap
Text File
|
1987-07-22
|
9KB
|
300 lines
' Program history
' ---------------
' Originally by: Brian Mccarson
' Modified to run under AppleSoft by: Tom Mornini
' Modified to run under AmigaBasic by: Randy Manchester 70775,1424
' Originally appeared in Kilobaud Microcomputing
' April 1981
SCREEN 1,640,200,3,2
WINDOW 2,,,0,1
WINDOW 3,"RatMaze!",(0,0)-(410,186),0,1
PALETTE 4,.2,.2,.2
COLOR 1,4
CLS
WINDOW OUTPUT 2
yc1 = 10
yc2 = 15
x = 515: y = 94 ' start of left arrow
COLOR 3
LINE (x,y)-STEP(-30,0) ' draw left arrow
LINE -STEP(0,-3)
LINE -STEP(-10,5)
LINE -STEP(10,5)
LINE -STEP(0,-3)
LINE -STEP(30,0)
LINE -STEP(0,-4)
PAINT STEP(-2,2),3
LINE (x+15,y)-STEP(30,0) ' draw left arrow
LINE -STEP(0,-3)
LINE -STEP(10,5)
LINE -STEP(-10,5)
LINE -STEP(0,-3)
LINE -STEP(-30,0)
LINE -STEP(0,-4)
PAINT STEP(2,2),3
LOCATE yc1
PRINT PTAB(x-8)"MOVE";
LOCATE yc2
PRINT PTAB(x-8)"VIEW";
WINDOW OUTPUT 3
100 zz = FRE (0)
200 GOTO 6400
300 ' draw 3d view at h,v
400 '
500 ' h,v=current location
600 ' s,r=facing (f)
700 ' a,b=looking coordinates
800 n = 2:a = h:b = v:ff = 2 ^ (f - 1)
900 CLS
1000 z = m(a,b) * ff
1100 REM left side
1200 IF FN m(z / 16) = 0 THEN 1500
1300 rl = - 1: GOSUB 5100
1400 GOTO 1900
1500 REM left back
1600 w = m(a + s,b - r) * ff
1700 IF FN m(w / 128) = 0 THEN 1900
1800 rl = - 1: GOSUB 4400
1900 REM right side
2000 IF FN m(z / 64) = 0 THEN 2300
2100 rl = 1: GOSUB 5100
2200 GOTO 2700
2300 REM right back
2400 w = m(a - s,b + r) * ff
2500 IF FN m(w / 128) = 0 THEN 2700
2600 rl = 1: GOSUB 4400
2700 REM back test
2800 IF FN m(z / 128) = 1 THEN 3300
2900 REM next level
3000 n = n + 1: IF n > 8 THEN 3500
3100 a = a + r:b = b + s: IF b < 2 THEN 3500
3200 GOTO 1000
3300 REM back end
3400 GOSUB 3600
3500 RETURN
3600 REM center back subroutine
3700 REM n=distance
3800 PSET (vx + dx(n),yu(n))
3900 LINE -(vx + dx(n),yd(n))
4000 LINE -(vx - dx(n),yd(n))
4100 LINE -(vx - dx(n),yu(n))
4200 LINE -(vx + dx(n),yu(n))
4300 RETURN
4400 REM back side subroutine
4500 REM rl=back side
4600 PSET (vx + rl * dx(n - 1),yu(n))
4700 LINE -(vx + rl * dx(n),yu(n))
4800 LINE -(vx + rl * dx(n),yd(n))
4900 LINE -(vx + rl * dx(n - 1),yd(n))
5000 RETURN
5100 REM side subroutine
5200 REM n=distance
5300 REM rl=which side (-1,+1)
5400 PSET (vx + rl * dx(n - 1),yu(n - 1))
5500 LINE -(vx + rl * dx(n),yu(n))
5600 LINE -(vx + rl * dx(n),yd(n))
5700 LINE -(vx + rl * dx(n - 1),yd(n - 1))
5800 IF n > 2 THEN LINE -(vx + rl * dx(n - 1),yu(n - 1))
5900 RETURN
6000 REM error sound subroutine
BEEP
6300 RETURN
6400 RANDOMIZE TIMER
6500 DEF FN m(x) = INT (x) - INT ( INT (x) / 2) * 2
6600 fx = 36: INPUT "please enter maze size (h,v) ";h,v: PRINT
6700 h = INT (h):v = INT (v)
6800 IF h > 2 AND h < 31 AND v > 2 AND v < 31 THEN 7000
6900 PRINT "2<h<31 -- 2<v<31": GOSUB 6000: GOTO 6600
7000 n = h * v - 1:h = h + 1:v = v + 1:d = 1:nm = 0
IF switch THEN ERASE m,w
7100 DIM m(32,32),w(400) : switch = 1
7200 FOR j = 1 TO v + 1:m(1,j) = 4:m(h + 1,j) = 1: NEXT j
7300 mx = 403:my = 183:vx = INT (mx / 2):vy = INT (my / 2):x = vx
7400 REM compute perspective points
7500 FOR j = 1 TO 8:dx(j) = x:yu(j) = INT (vy - x * vy / vx)
7600 yd(j) = INT (vy + x * (my - vy) / vx):x = INT (x * 7 / 10): NEXT j
7700 FOR i = 2 TO h:m(i,v + 1) = 8:m(i,1) = 2
7800 FOR j = 2 TO v:m(i,j) = 15: NEXT j,i
7900 REM
8000 REM 8 = top wall
8100 REM 4 = right wall
8200 REM 2 = bottom wall
8300 REM 1 = left wall
8400 REM
8500 r = INT (h / 2 + 1):s = INT (v / 2 + 1):m(r,s) = 15
8600 PRINT "generating maze.": GOSUB 6000
8700 REM generate maze
8800 REM algorithm from rogers and strassberger
8900 FOR iw = 1 TO n
9000 i = 0
9100 IF m(r - 1,s) < 15 THEN 9300
9200 i = i + 1:c(i) = 1
9300 IF m(r,s - 1) < 15 THEN 9500
9400 i = i + 1:c(i) = 2
9500 IF m(r + 1,s) < 15 THEN 9700
9600 i = i + 1:c(i) = 3
9700 IF m(r,s + 1) < 15 THEN 9900
9800 i = i + 1:c(i) = 4
9900 IF i = 0 THEN 12300
10000 IF i < > 1 THEN i = INT ( RND (1) * i) + 1
10100 ON c(i) GOTO 10300,10800,11300,11800
10200 REM move west
10300 m(r,s) = m(r,s) - FN m(m(r,s))
10400 r = r - 1
10500 m(r,s) = m(r,s) - FN m(m(r,s) / 4) * 4
10600 GOTO 13400
10700 REM move north
10800 m(r,s) = m(r,s) - FN m(m(r,s) / 8) * 8
10900 s = s - 1
11000 m(r,s) = m(r,s) - FN m(m(r,s) / 2) * 2
11100 GOTO 13400
11200 REM move east
11300 m(r,s) = m(r,s) - FN m(m(r,s) / 4) * 4
11400 r = r + 1
11500 m(r,s) = m(r,s) - FN m(m(r,s))
11600 GOTO 13400
11700 REM move south
11800 m(r,s) = m(r,s) - FN m(m(r,s) / 2) * 2
11900 s = s + 1
12000 m(r,s) = m(r,s) - FN m(m(r,s) / 8) * 8
12100 GOTO 13400
12200 REM scan for unused point
12300 IF d = - 1 THEN 12700
12400 IF r < > h THEN 13100
12500 IF s < > v THEN 13000
12600 r = 2:s = 2: GOTO 13200
12700 IF r < > 2 THEN 13100
12800 IF s < > v THEN 13000
12900 r = h:s = 2: GOTO 13200
13000 s = s + 1:d = - d: GOTO 13200
13100 r = r + d
13200 IF m(r,s) = 15 THEN 12300
13300 GOTO 9000
13400 NEXT iw
13500 mh = h:mv = v
13600 REM random point at south for starting point
13700 i = INT ( RND (1) * (mh - 1)) + 2
13800 m(i,1) = 0
13900 m(i,2) = m(i,2) - FN m(m(i,2) / 8) * 8
14000 h = INT ( RND (1) * (mh - 1)) + 2
14100 h1 = h:v1 = v
14200 GOSUB 6000
14300 PRINT "maze completed.": GOSUB 6000
14400 GOTO 16900
14500 REM display top view of maze
14600 REM calculate display scale
14700 hz = INT (mx / mh):vz = INT (my / mv)
14800 CLS
14900 PSET (1 + hz,1 + vz)
15000 LINE -(1 + hz,mv * vz + 1)
15100 FOR j = 1 TO mv: FOR i = 2 TO mh
15200 n = m(i,j):x = i * hz + 1:y = j * vz + 1
15300 IF FN m(n / 2) = 0 THEN 15700
15400 REM draw south wall
15500 PSET (x,y)
15600 LINE -(x - hz,y)
15700 IF FN m(n / 4) = 0 THEN 16100
15800 REM draw east wall
15900 PSET (x,y)
16000 LINE -(x,y - vz)
16100 NEXT i,j
16200 REM mark rat's position
16300 x = h * hz - 1:y = v * vz - 1
COLOR 3
16400 PSET (x + 1,y + 1)
16500 LINE -(x - hz + 2,y - vz + 2)
16600 PSET (x - hz + 2,y + 1)
16700 LINE -(x + 1,y - vz + 2)
COLOR 1,4
16800 RETURN
16900 REM add redundant bits
17000 FOR x = 1 TO mh: FOR y = 1 TO mv
17100 m(x,y) = m(x,y) + m(x,y) * 16
17200 NEXT y,x
17300 REM play the game
17400 REM initial direction
17500 f = INT ( RND (1) * 4) + 1
17600 ON f GOTO 17700,17800,17900,18000
17700 r = 0:s = - 1: GOTO 18100
17800 r = 1:s = 0: GOTO 18100
17900 r = 0:s = 1: GOTO 18100
18000 r = - 1:s = 0
18100 GOSUB 300
18200 ' Get player's next move
18300 IF MOUSE(0) = 0 THEN GOTO 18300
mox = MOUSE(5)
moy = MOUSE(6)
IF mox > 474 AND mox < 516 AND moy > 82 AND moy < 90 THEN 19000
IF mox > 529 AND mox < 571 AND moy > 82 AND moy < 90 THEN 19300
IF mox > 507 AND mox < 540 AND moy > 70 AND moy < 80 THEN 20000
IF mox > 507 AND mox < 540 AND moy > 110 AND moy < 120 THEN 21200
GOTO 18300
18900 GOSUB 6000: GOTO 18300
19000 REM left <-
19100 f = f - 1: IF f < 1 THEN f = 4
19200 GOTO 19500
19300 REM right ->
19400 f = f + 1: IF f > 4 THEN f = 1
19500 ON f GOTO 19600,19700,19800,19900
19600 r = 0:s = - 1: GOTO 21000
19700 r = 1:s = 0: GOTO 21000
19800 r = 0:s = 1: GOTO 21000
19900 r = - 1:s = 0: GOTO 21000
20000 REM forward
20100 z = m(h,v)
20200 t = z * 2 ^ (f - 1):t = FN m(t / 128)
20300 IF t = 0 THEN 20600
20400 REM bumped into wall
20500 GOSUB 6000: GOTO 18300
20600 nm = nm + 1
WINDOW OUTPUT 2
LOCATE 23
PRINT PTAB(510)"MOVE "nm
WINDOW OUTPUT 3
20700 IF nm < 400 THEN w(nm) = f
20800 h = h + r:v = v + s
20900 IF v < 2 THEN 21500
21000 GOSUB 300
21100 GOTO 18300
21200 REM cheat
21300 GOSUB 14500
21400 GOTO 18300
21500 WINDOW OUTPUT 3:CLS : PRINT "congrats, it took you "nm" steps."
FOR zzz = 0 TO 6000:NEXT zzz
21600 GOSUB 6000: GOSUB 6000: GOSUB 6000
21700 v = v1:h = h1: GOSUB 14500
21800 REM draw path walked
21900 x = INT (h * hz - hz / 2) + 1:y = INT (v * vz - vz / 2) + 1
COLOR 3
22000 PSET (x,y)
22100 FOR n = 1 TO nm
22200 IF n > 400 THEN 22900
22300 f = w(n)
22400 IF f = 1 THEN v = v - 1
22500 IF f = 2 THEN h = h + 1
22600 IF f = 3 THEN v = v + 1
22700 IF f = 4 THEN h = h - 1
22800 LINE -(INT (h * hz - hz / 2) + 1, INT (v * vz - vz / 2) + 1)
22900 NEXT n
COLOR 1,4
23000 IF MOUSE(0) = 0 THEN 23000
GOTO 6400